package com.scse.bms.mapper;

import com.scse.bms.domain.UserCaseVO;
import com.scse.bms.domain.UserVO;
import com.scse.bms.entity.UserDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;


/**
 * @Title: CustomerMapper 用户Mapper接口
 * @Author: 吴赠禹
 * @Date: 2020/10/29 17:20
 * @Description: TODO
 */
@Repository
@Mapper
public interface UserMapper {
    /**
     * 插入用户
     *
     * @param userDO
     * @return 受影响行数
     */
    int insert(UserDO userDO);

    /**
     * 设置用户状态（0：禁用，1：启用）
     *
     * @param id
     * @return
     */
    int updateUserValid(@Param("valid") int valid, @Param("id") int id);

    /**
     * 根据主键删除用户
     *
     * @param id
     * @return 受影响行数
     */
    int deleteByPrimaryKey(Integer id);

    /**
     * 根据主键查询用户
     *
     * @param id
     * @return 用户
     */
    UserDO selectById(Integer id);

    /**
     * 有选择地更新用户信息
     *
     * @param userDO
     * @return 受影响行数
     */
    int updateByPrimaryKeySelective(UserDO userDO);

    /**
     * 判断用户名可用
     *
     * @param userDO
     * @return
     */
    UserDO selectByUsername(UserDO userDO);

    /**
     * 判断手机号码是否可用
     *
     * @param userDO
     * @return
     */
    UserDO selectByPhoneNum(UserDO userDO);

    /**
     *
     * @param userDO
     * @return
     */
    UserDO selectByRealName(UserDO userDO);

    /**
     * 根据用户名密码查询用户，用于登录
     *
     * @param username
     * @param password
     * @return
     */
    UserVO selectByUsernameAndPassword(@Param("username") String username, @Param("password") String password);


    /**
     * 根据用户ID查找用户信息，用于重新保存session
     * @param id
     * @return
     */
    UserVO selectUserForSessionById(@Param("id") Integer id);


    /**
     * 根据手机号码和密码查询用户，用于登录
     * @param phoneNum
     * @param password
     */
    UserVO selectByPhoneNumAndPassword(@Param("phoneNum") String phoneNum, @Param("password") String password);
    

    /**
     * 返回用户信息总数
     * @return
     */
    int selectAllUserCount();


    /**
     * 获取符合条件的用户总数
     * @param map （方便重用sql，使用map封装）
     * @return
     */
    int statAllUserByCase(Map<String, Object> map);

    /**
     * 查询符合条件的用户信息
     * @param map 封装多个参数【用户条件、page、limit】
     * @return
     */
    List<UserVO> selectAllUserByCase(Map<String, Object> map);

    /**
     * 修改用户密码
     * @param map {id: , password: }
     * @return
     */
    int updatePassword(Map<String, String> map);


    /**
     * 用户个人中心 TODO 暂时不需要，因为用户登录加入了session，包括头像
     * @param id
     * @return
     */
    @Select("select u.id, username, real_name, gender, email, phone_num, register_time ,src FROM \n" +
            "(select id, username, real_name, gender, email, phone_num, register_time FROM t_user where id = 31) u \n" +
            "left join t_user_head_img uh ON u.id = uh.user_id  left join t_head_img h ON\n" +
            "uh.head_img_id = h.id ")
    UserVO selectUserById(int id);


    /**
     * 查询用户名是否存在
     * @param username 参数唯一可以不用@Param注解
     * @return
     */
    @Select("select id from t_user where username = #{username}  limit 1")
    Integer selectUserNameIfExistById(String username);

    /**
     * 根据ID修改用户名
     * @param userDO
     * @return
     */
    @Update("update t_user set username = #{username} where id = #{id}")
    int updateUserNameById(UserDO userDO);


    /**
     * 查询邮箱是否存在
     * @param email
     * @return
     */
    @Select("select id from t_user where email = #{email} limit 1")
    Integer selectEmailIfExistById(String email);


    /**
     * 修改用户邮箱
     * @param userDO
     * @return
     */
    @Update("update t_user set email = #{email} where id = #{id}")
    int updateEmailById(UserDO userDO);


    /**
     * 查询密码是否正确
     * @param userDO
     * @return
     */
    @Select("select id from t_user where id =#{id} and password = #{password}")
    Integer selectUserIfExistByUserNameAndPassword(UserDO userDO);


    /**
     * 修改用户密码
     * @param userDO
     * @return
     */
    @Update("update t_user set password = #{password} where id = #{id}")
    int updatePasswordById(UserDO userDO);


}
